package com.ushine.design.jdk8.time;

import java.time.LocalDate;
import java.time.LocalDateTime;
import java.time.LocalTime;
import java.time.Month;
import java.time.ZoneId;
import java.time.ZonedDateTime;

/**
 * 在旧版的Java中，日期时间API存在诸多问题，其中有：
 * 1).非线程安全 - java.util.Date是非线程安全的，所有的日期类都是可变的，这是java日期类最大的问题之一。
 * 2).设计很差 - java的日期/时间类的定义并不一致，在java.util和java.sql的包中都有日期类，此外用于格式化和解析的类在
 * java.text包中定义。java.util.Date同时包含日期和时间。而java.sql.Date仅包含日期，将其纳入java.sql
 * 包中并不合理。另外这两个类都有相同的名字，这本身就是一个非常糟糕的设计。
 * 3).时区处理麻烦 - 日期类并不提供国际化，没有时区支持。因此Java引入java.util.Calendar和java.util.TimeZone类，但他们
 * 同样存在上述所有的问题。
 * <p>
 * <p>
 * 在java8中，java.time提供了很多新的API，以下两个比较重要的API：
 * 4).Local(本地) - 简化了日期时间的处理。没有时区的问题。
 * 5).Zoned(时区) - 通过制定的时区处理日期时间
 * <p>
 * 新的java.time包含了所有处理日期、时间、日期/时间、时区、时刻（instants），过程（during）与时钟（clock）的操作。
 *
 * @author yls
 */
public class DataTimeAPI {
    public static void main(String[] args) {
        DataTimeAPI api = new DataTimeAPI();
        api.testLocalDateTime();
        api.testZoneDateTime();
    }


    /**
     * Local-本地时间，没有时区的问题
     */
    public void testLocalDateTime() {
        //获取当前的日期时间
        LocalDateTime currentime = LocalDateTime.now();
        System.out.println("当前时间：" + currentime);

        LocalDate localDate = currentime.toLocalDate();
        System.out.println("localDate：" + localDate);

        Month month = currentime.getMonth();
        int dayOfMonth = currentime.getDayOfMonth();
        int second = currentime.getSecond();
        System.out.println("月：" + month + ",日：" + dayOfMonth + ",秒：" + second);

        LocalDateTime date2 = currentime.withDayOfMonth(10).withYear(2012);
        System.out.println("date2：" + date2);

        //12 december 2014
        LocalDate date3 = LocalDate.of(2014, Month.DECEMBER, 12);
        System.out.println("date3：" + date3);

        //22小时15分钟
        LocalTime date4 = LocalTime.of(22, 15);
        System.out.println("date4：" + date4);

        //解析字符串
        LocalTime date5 = LocalTime.parse("20:15:30");
        System.out.println("date5：" + date5);
    }


    /**
     * Zone - 时区
     */
    public void testZoneDateTime() {
        ZonedDateTime dateTime = ZonedDateTime.parse("2015-12-03T10:15:30+05:30[Asia/Shanghai]");
        System.out.println("dateTime：" + dateTime);

        ZoneId id = ZoneId.of("Europe/Paris");
        System.out.println("ZoneId：" + id);

        ZoneId systemDefault = ZoneId.systemDefault();
        System.out.println("当前时区：" + systemDefault);

    }
}
